/*================================================================
*   Copyright (C) 2022 Sangfor Ltd. All rights reserved.
*   
*   文件名称：oj_view.hpp
*   创 建 者：wudu
*   创建日期：2022年03月31日
*   描    述：渲染模块
*               1.渲染展示全部试题页面
*               2.渲染单个试题页面
*
================================================================*/

#pragma once
#include <iostream>
#include <vector>
#include <json/json.h>
#include <ctemplate/template.h>

#include "oj_model.hpp"


class OjView{
    public:
    /*
     * 1.vec ： 全部试题信息的容器
     * 2.html: return caller html stream
     * */
    static void DrawAllQuestionHtml(vector<Question>& vec, string* html){
        //1.创建一个template字典
        ctemplate::TemplateDictionary dict("all_questions");
        //2.根据传入的试题信息， 创建子字典
        for(const auto& k : vec){
            ctemplate::TemplateDictionary* sub_dict = dict.AddSectionDictionary("question");

            sub_dict->SetValue("id", k.id_);
            sub_dict->SetValue("id", k.id_);
            sub_dict->SetValue("title", k.title_);
            sub_dict->SetValue("star", k.star_);
        }
        //3.读磁盘当中预定义的html页面文件
        ctemplate::Template* tl = ctemplate::Template::GetTemplate("./www/index.html", ctemplate::DO_NOT_STRIP);
        //4.渲染填充
        tl->Expand(html, &dict);
    }

    static void DrawOneQuestionHtml(const Question& ques, string* html){
        //1.创建一个template字典
        ctemplate::TemplateDictionary dict("one_questions");
        dict.SetValue("id", ques.id_);
        dict.SetValue("title", ques.title_);
        dict.SetValue("star", ques.star_);
        dict.SetValue("desc", ques.desc_);
        dict.SetValue("code", ques.header_cpp_);
        //2.读磁盘当中预定义的html页面文件
        ctemplate::Template* tl = ctemplate::Template::GetTemplate("./template/question.html", ctemplate::DO_NOT_STRIP);
        //3.渲染填充
        tl->Expand(html, &dict);
    }

    static void DrawCaseResultHtml(const Json::Value& resp_json, string* html){
        string err_no = resp_json["errorno"].asString();                                                
        string reason = resp_json["reason"].asString();    
        string std_out = resp_json["stdout"].asString();
        
        ctemplate::TemplateDictionary dict("one_questions");
        dict.SetValue("errno", err_no);
        dict.SetValue("compile_result", reason);
        dict.SetValue("case_result", std_out);
        
        ctemplate::Template* tl = ctemplate::Template::GetTemplate("./template/case_result.html", ctemplate::DO_NOT_STRIP);
        tl->Expand(html, &dict);
    }
};
